home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 11 / CU Amiga Magazine's Super CD-ROM 11 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-06].iso / cucd / programming / oberonv4 / source / system / amigaexec.mod (.txt) < prev    next >
Oberon Text  |  1996-07-28  |  15KB  |  474 lines

  1. Syntax10.Scn.Fnt
  2. Syntax10i.Scn.Fnt
  3. ParcElems
  4. Alloc
  5. Syntax10b.Scn.Fnt
  6. Syntax16b.Scn.Fnt
  7. Syntax16.Scn.Fnt
  8. MODULE AmigaExec;    (* SHML/CN 15. Mar 93, 23 Jun 94, RD 25 Dec 95, OJ 30 Apr 96 *)
  9.     Register() and TermAll() added for correct cleanup, OJ 11-May-96
  10.     Interface of WaitIO(), SendIO() changed, OJ 26-May-96
  11.  IMPORT SYSTEM;
  12. CONST
  13.   true    * = LONG(1);    (* use these !! *)
  14.   false    * = LONG(0);
  15.   null    * = LONG(LONG(0));
  16.  (* Flags for AllocMem *)
  17.   memAny    * = {};    (* Any type of memory will do *)
  18.   memPublic    * = 0;
  19.   memChip    * = 1;
  20.   memFast    * = 2;
  21.   memLocal    * = 8;
  22.   mem24BitDMA    * = 9;    (* DMAable memory within 24 bits of address *)
  23.   memKick    * = 10;    (* Memory that can be used for KickTags *)
  24.   memClear    * = 16;
  25.   memLargest    * = 17;
  26.   memReverse    * = 18;
  27.   memTotal    * = 19;    (* AvailMem: return total size of memory *)
  28.   memNoExpunge    * = 31;    (* AllocMem: Do not cause expunge on failure *)
  29. (* IORequest.command: *)
  30.   invalid    * = 0;
  31.   reset    * = 1;
  32.   read    * = 2;
  33.   write    * = 3;
  34.   update    * = 4;
  35.   clear    * = 5;
  36.   stop    * = 6;
  37.   start    * = 7;
  38.   flush    * = 8;
  39.   nonstd    * = 9;
  40. (* node types for lists *)
  41.   ntUnknown    * = 0;
  42.   ntTask    * = 1;    (* Exec task *)
  43.   ntInterrupt    * = 2;
  44.   ntDevice    * = 3;
  45.   ntMsgPort    * = 4;
  46.   ntMessage    * = 5;    (* Indicates message currently pending *)
  47.   ntFreeMsg    * = 6;
  48.   ntReplyMsg    * = 7;    (* Message has been replied *)
  49.   ntResource    * = 8;
  50.   ntLibrary    * = 9;
  51.   ntMemory    * = 10;
  52.   ntSoftInt    * = 11;    (* Internal flag used by SoftInits *)
  53.   ntFont    * = 12;
  54.   ntProcess    * = 13;    (* AmigaDOS Process *)
  55.   ntSemaphore    * = 14;
  56.   ntSignalSem    * = 15;    (* signal semaphores *)
  57.   ntBootNode    * = 16;
  58.   ntKickMem    * = 17;
  59.   ntGraphics    * = 18;
  60.   ntDeathMessage    * = 19;
  61.   ntUser    * = -2;    (* User node types work down from here *)
  62.   ntExtended    * = -1;
  63.  PROC*=PROCEDURE;
  64.  TaskPtr*=LONGINT;
  65.   UnitPtr* = LONGINT;
  66.   IORequestPtr      * = LONGINT;
  67.   IOStdReqPtr       * = LONGINT;
  68.  NodePtr*=LONGINT;
  69.  Node*=RECORD
  70.   succ*:NodePtr;
  71.   pred*:NodePtr;
  72.   type*:SHORTINT;
  73.   pri*:SHORTINT;
  74.   name*:LONGINT
  75.  END;
  76.  List*=RECORD
  77.   head*:NodePtr;
  78.   tail*:NodePtr;
  79.   tailPred*:NodePtr;
  80.   type*:SHORTINT;
  81.   pad*:SHORTINT
  82.  END;
  83.  MinNodePtr*=LONGINT;
  84.  MinNode*=RECORD
  85.   succ*:MinNodePtr;
  86.   pred*:MinNodePtr
  87.  END;
  88.  MinList*=RECORD
  89.   head*,tail*,tailPred*:MinNodePtr
  90.  END;
  91.  MsgPortPtr*=LONGINT;
  92.  MsgPort*=RECORD
  93.   node*:Node;
  94.   flags*:SHORTINT;
  95.   sigBit*:SHORTINT;
  96.   sigTask*:TaskPtr;
  97.   msgList*:List
  98.  END;
  99.   Unit * = RECORD
  100.     msgPort * : MsgPort;    (* queue for unprocessed messages *)
  101.                             (* instance of msgport is recommended *)
  102.     flags   * : SHORTINT;
  103.     pad     * : SHORTINT;
  104.     openCnt * : INTEGER;                (* number of active opens *)
  105.   END;
  106.  SemaphoreRequest*=RECORD
  107.   link*:MinNode;
  108.   waiter*:TaskPtr
  109.  END;
  110.  SignalSemaphore*=RECORD
  111.   link*:Node;
  112.   nestCount*:INTEGER;
  113.   waitQueue*:MinList;
  114.   multipleLink*:SemaphoreRequest;
  115.   owner*:TaskPtr;
  116.   queueCount*:INTEGER
  117.  END;
  118.  Message*=RECORD
  119.   node*:Node;
  120.   replyPort*:MsgPortPtr;
  121.   length*:INTEGER
  122.  END;
  123.  MessagePtr*=LONGINT;
  124.  Task*=RECORD
  125.   node*:Node;
  126.   flags*:SHORTINT;
  127.   state*:SHORTINT;
  128.   idNestCnt:SHORTINT;
  129.   tdNestCnt:SHORTINT;
  130.   sigAlloc:SET;
  131.   sigWait*:SET;
  132.   sigRecvd*:SET;
  133.   sigExcept:SET;
  134.   trapAlloc:INTEGER;
  135.   trapAble:INTEGER;
  136.   exceptData*:LONGINT;
  137.   exceptCode*:LONGINT;
  138.   trapData*:LONGINT;
  139.   trapCode*:LONGINT;
  140.   spReg*:LONGINT;
  141.   spLower*:LONGINT;
  142.   spUpper*:LONGINT;
  143.   switch:LONGINT;
  144.   launch:LONGINT;
  145.   memEntry:List;
  146.   userData*:LONGINT
  147.  END;
  148.  Library*=RECORD
  149.     node*:Node;
  150.     flags*:SHORTINT;
  151.     pad*:SHORTINT;
  152.     negSize*:INTEGER;
  153.     posSize*:INTEGER;
  154.     version*:INTEGER;
  155.     revision*:INTEGER;
  156.     idString*:LONGINT;
  157.     sum*:LONGINT;
  158.     openCnt*:INTEGER
  159.  END;
  160.  LibraryPtr*=LONGINT;
  161.  DevicePtr*=LONGINT;
  162.  IORequest * = RECORD
  163.    message * : Message;
  164.    device  * : DevicePtr;          (* device node pointer  *)
  165.    unit    * : UnitPtr;                (* unit (driver private)*)
  166.    command * : INTEGER;       (* device command *)
  167.    flags   * : SHORTINT;
  168.    error   * : SHORTINT;          (* error or warning num *)
  169.  END;
  170.  IOStdReq * = RECORD
  171.    message * : Message;
  172.    device  * : DevicePtr;          (* device node pointer  *)
  173.    unit    * : UnitPtr;                (* unit (driver private)*)
  174.    command * : INTEGER;       (* device command *)
  175.    flags   * : SHORTINT;
  176.    error   * : SHORTINT;          (* error or warning num *)
  177.    actual  * : LONGINT;            (* actual number of bytes transferred *)
  178.    length  * : LONGINT;            (* requested number bytes transferred*)
  179.    data    * : LONGINT;             (* points to data area *)
  180.    offset  * : LONGINT;              (* offset for block structured devices *)
  181.  END;
  182.  MemPoolPtr*=LONGINT;
  183.  TermProc = PROCEDURE ();
  184.  TermEntryPtr = LONGINT;
  185.  TermEntry * = RECORD
  186.   next : TermEntryPtr;
  187.   proc : TermProc;
  188.  END;
  189.     execBase- : LibraryPtr;
  190.     execVersion- : INTEGER;
  191.     termEntry : TermEntry;
  192.     termList : TermEntryPtr;
  193.     dummy : LONGINT;
  194. PROCEDURE -ReturnD0    04EH,05EH,  04EH,075H;
  195. PROCEDURE AddTask*(task:TaskPtr; initialPC, finalPC:LONGINT):LONGINT;
  196. BEGIN
  197.     SYSTEM.PUTREG( 9, task );
  198.     SYSTEM.PUTREG( 10, initialPC );
  199.     SYSTEM.PUTREG( 11, finalPC );
  200.     SYSTEM.CALL( -282, execBase );
  201.     ReturnD0
  202. END AddTask;
  203. PROCEDURE RemTask*(task:TaskPtr);
  204. BEGIN
  205.     SYSTEM.PUTREG( 9, task );
  206.     SYSTEM.CALL( -288, execBase );
  207.     ReturnD0
  208. END RemTask;
  209. PROCEDURE AllocMem*(size:LONGINT; reqs:SET):LONGINT;
  210. BEGIN
  211.     SYSTEM.PUTREG( 0, size );
  212.     SYSTEM.PUTREG( 1, reqs );
  213.     SYSTEM.CALL( -198, execBase );
  214.     ReturnD0
  215. END AllocMem;
  216. PROCEDURE FreeMem*(adr,size:LONGINT);
  217. BEGIN
  218.     SYSTEM.PUTREG( 9, adr );
  219.     SYSTEM.PUTREG( 0, size );
  220.     SYSTEM.CALL( -210, execBase )
  221. END FreeMem;
  222. PROCEDURE CopyMemAPTR*(source,dest,size:LONGINT);
  223. BEGIN
  224.     SYSTEM.PUTREG( 8, source );
  225.     SYSTEM.PUTREG( 9, dest );
  226.     SYSTEM.PUTREG( 0, size );
  227.     SYSTEM.CALL( -624, execBase )
  228. END CopyMemAPTR;
  229. PROCEDURE Forbid*();
  230. BEGIN
  231.     SYSTEM.CALL( -132, execBase )
  232. END Forbid;
  233. PROCEDURE FindTask*(name:LONGINT):TaskPtr;
  234. BEGIN
  235.     SYSTEM.PUTREG( 9, name );
  236.     SYSTEM.CALL( -294, execBase );
  237.     ReturnD0
  238. END FindTask;
  239. PROCEDURE Permit*();
  240. BEGIN
  241.     SYSTEM.CALL( -138, execBase )
  242. END Permit;
  243. PROCEDURE SetTaskPri*(task: TaskPtr; pri: LONGINT): LONGINT;
  244. BEGIN
  245.     SYSTEM.PUTREG( 9, task );
  246.     SYSTEM.PUTREG( 0, pri );
  247.     SYSTEM.CALL( -300, execBase );
  248.     ReturnD0
  249. END SetTaskPri;
  250. PROCEDURE SetExcept*(newSig, setSig : SET) : SET;
  251. BEGIN
  252.     SYSTEM.PUTREG( 0, newSig);
  253.     SYSTEM.PUTREG( 1, setSig);
  254.     SYSTEM.CALL( -312, execBase);
  255.     ReturnD0
  256. END SetExcept;
  257. PROCEDURE Signal*( task : TaskPtr;  sig : SET);
  258. BEGIN
  259.     SYSTEM.PUTREG( 9, task);
  260.     SYSTEM.PUTREG( 0, sig);
  261.     SYSTEM.CALL( -324, execBase);
  262. END Signal;
  263. PROCEDURE OpenLibrary*(libName:ARRAY OF CHAR; version:LONGINT):LibraryPtr;
  264. BEGIN
  265.     SYSTEM.PUTREG( 9, SYSTEM.ADR(libName) );
  266.     SYSTEM.PUTREG( 0, version );
  267.     SYSTEM.CALL( -552, execBase );
  268.     ReturnD0
  269. END OpenLibrary;
  270. PROCEDURE CloseLibrary*(libBase:LibraryPtr);
  271. BEGIN
  272.     SYSTEM.PUTREG( 9, libBase );
  273.     SYSTEM.CALL( -414, execBase );
  274. END CloseLibrary;
  275. PROCEDURE OpenDevice*(devName:ARRAY OF CHAR; unit: LONGINT;
  276.                                         ioRequest: IORequestPtr; flags: SET) : SHORTINT;
  277. BEGIN
  278.     SYSTEM.PUTREG( 8, SYSTEM.ADR(devName) );
  279.     SYSTEM.PUTREG( 0, unit );
  280.     SYSTEM.PUTREG( 9, ioRequest );
  281.     SYSTEM.PUTREG( 1, flags );
  282.     SYSTEM.CALL( -444, execBase );
  283.     SYSTEM.GETREG( 0, dummy );
  284.     RETURN SHORT(SHORT(dummy))
  285. END OpenDevice;
  286. PROCEDURE CloseDevice*(ioRequest: IORequestPtr);
  287. BEGIN
  288.     SYSTEM.PUTREG( 9, ioRequest );
  289.     SYSTEM.CALL( -450, execBase )
  290. END CloseDevice;
  291. PROCEDURE WaitPort*(port: MsgPortPtr);
  292. BEGIN
  293.     SYSTEM.PUTREG( 8, port );
  294.     SYSTEM.CALL( -384, execBase )
  295. END WaitPort;
  296. PROCEDURE GetMsg*(port: MsgPortPtr): MessagePtr;
  297. BEGIN
  298.     SYSTEM.PUTREG( 8, port );
  299.     SYSTEM.CALL( -372, execBase );
  300.     ReturnD0
  301. END GetMsg;
  302. PROCEDURE ReplyMsg*(msg: MessagePtr);
  303. BEGIN
  304.     SYSTEM.PUTREG( 9, msg );
  305.     SYSTEM.CALL( -378, execBase )
  306. END ReplyMsg;
  307. PROCEDURE DoIO*(ioRequest: IORequestPtr): SHORTINT;
  308. BEGIN
  309.     SYSTEM.PUTREG( 9, ioRequest );
  310.     SYSTEM.CALL( -456, execBase );
  311.     SYSTEM.GETREG( 0, dummy );
  312.     RETURN SHORT(SHORT(dummy))
  313. END DoIO;
  314. PROCEDURE SendIO*(ioRequest: IORequestPtr);
  315. BEGIN
  316.     SYSTEM.PUTREG( 9, ioRequest );
  317.     SYSTEM.CALL( -462, execBase )
  318. END SendIO;
  319. PROCEDURE CheckIO*(ioRequest: IORequestPtr): BOOLEAN;
  320. BEGIN
  321.     SYSTEM.PUTREG( 9, ioRequest );
  322.     SYSTEM.CALL( -468, execBase );
  323.     SYSTEM.GETREG( 0, dummy );
  324.     RETURN dummy#false
  325. END CheckIO;
  326. PROCEDURE WaitIO*(ioRequest: IORequestPtr): SHORTINT;
  327. BEGIN
  328.     SYSTEM.PUTREG( 9, ioRequest );
  329.     SYSTEM.CALL( -474, execBase );
  330.     SYSTEM.GETREG( 0, dummy );
  331.     RETURN SHORT(SHORT(dummy))
  332. END WaitIO;
  333. PROCEDURE AbortIO*(ioRequest: IORequestPtr): LONGINT;
  334. BEGIN
  335.     SYSTEM.PUTREG( 9, ioRequest );
  336.     SYSTEM.CALL( -480, execBase );
  337.     ReturnD0
  338. END AbortIO;
  339. PROCEDURE CreateMsgPort*(): MsgPortPtr;
  340. BEGIN
  341.     SYSTEM.CALL( -666, execBase );
  342.     ReturnD0
  343. END CreateMsgPort;
  344. PROCEDURE DeleteMsgPort*(port: MsgPortPtr);
  345. BEGIN
  346.     SYSTEM.PUTREG( 8, port );
  347.     SYSTEM.CALL( -672, execBase )
  348. END DeleteMsgPort;
  349. PROCEDURE CreateIORequest*(port: MsgPortPtr; size: LONGINT): IORequestPtr;
  350. BEGIN
  351.     SYSTEM.PUTREG( 8, port );
  352.     SYSTEM.PUTREG( 0, size );
  353.     SYSTEM.CALL( -654, execBase );
  354.     ReturnD0
  355. END CreateIORequest;
  356. PROCEDURE DeleteIORequest*(iorequest: IORequestPtr);
  357. BEGIN
  358.     SYSTEM.PUTREG( 8, iorequest );
  359.     SYSTEM.CALL( -660, execBase )
  360. END DeleteIORequest;
  361. (* Memory Pool Procedures *)
  362. PROCEDURE CreatePool*(reqs: SET; puddleSize, threshSize: LONGINT):MemPoolPtr;
  363. BEGIN
  364.     SYSTEM.PUTREG( 0, reqs );
  365.     SYSTEM.PUTREG( 1, puddleSize );
  366.     SYSTEM.PUTREG( 2, threshSize );
  367.     SYSTEM.CALL( -696, execBase );
  368.     ReturnD0
  369. END CreatePool;
  370. PROCEDURE DeletePool*(pool: MemPoolPtr);
  371. BEGIN
  372.     SYSTEM.PUTREG( 8, pool );
  373.     SYSTEM.CALL( -702, execBase )
  374. END DeletePool;
  375. PROCEDURE AllocPooled*(pool: MemPoolPtr; size: LONGINT):LONGINT;
  376. BEGIN
  377.     SYSTEM.PUTREG( 8, pool );
  378.     SYSTEM.PUTREG( 0, size );
  379.     SYSTEM.CALL( -708, execBase );
  380.     ReturnD0
  381. END AllocPooled;
  382. PROCEDURE FreePooled*(pool: MemPoolPtr; adr, size: LONGINT);
  383. BEGIN
  384.     SYSTEM.PUTREG( 8, pool );
  385.     SYSTEM.PUTREG( 9, adr );
  386.     SYSTEM.PUTREG( 0, size );
  387.     SYSTEM.CALL( -714, execBase )
  388. END FreePooled;
  389. (* Exec support *)
  390. PROCEDURE CreateTask*(name:ARRAY OF CHAR; pri:SHORTINT; initPC:PROC; stackSize:LONGINT):TaskPtr;
  391.     TaskPointer = POINTER TO Task;
  392.     NamePtr = POINTER TO ARRAY 1 OF CHAR;
  393.     newptr, task: TaskPtr;  newtask: TaskPointer;
  394.     stack: LONGINT;
  395.     p : NamePtr;
  396. BEGIN
  397.     task := null;
  398.     newptr := AllocMem(SIZE(Task), {memClear});
  399.     IF newptr # null THEN
  400.         stackSize := (stackSize + 7) DIV 8 * 8;
  401.         stack := AllocMem(stackSize, {memPublic});
  402.         IF stack # null THEN
  403.             p := SYSTEM.VAL( NamePtr, AllocMem(LEN(name)+1, {}) );
  404.             IF p # NIL THEN  COPY(name, p^);
  405.                 newtask := SYSTEM.VAL(TaskPointer, newptr);
  406.                 newtask.spLower := stack;
  407.                 newtask.spUpper := stack+stackSize;
  408.                 newtask.spReg   := newtask.spUpper;
  409.                 newtask.node.type := ntTask;
  410.                 newtask.node.pri := pri;
  411.                 newtask.node.name := SYSTEM.VAL(LONGINT,p);
  412.                 task := AddTask(newptr, SYSTEM.VAL(LONGINT,initPC), null);
  413.             END;
  414.         END;
  415.     END;
  416.     IF task = null THEN
  417.         IF newptr # null THEN
  418.             IF stack # null THEN
  419.                 IF p # NIL THEN  FreeMem(SYSTEM.VAL(LONGINT,p), LEN(name)+1)  END;
  420.                 FreeMem(stack, stackSize)
  421.             END;
  422.             FreeMem(newptr, SIZE(Task))
  423.         END;
  424.     END;
  425.     RETURN task
  426. END CreateTask;
  427. PROCEDURE DeleteTask*(ptr:TaskPtr);
  428.     TaskPointer = POINTER TO Task;
  429.     NamePtr = POINTER TO ARRAY 1 OF CHAR;
  430.     task: TaskPointer;
  431.     p : NamePtr;
  432. BEGIN
  433.     IF ptr # null THEN
  434.         RemTask(ptr);
  435.         task := SYSTEM.VAL(TaskPointer, ptr);  p := SYSTEM.VAL(NamePtr,task.node.name);
  436.         FreeMem(task.node.name, LEN(p^)+1);
  437.         FreeMem(task.spLower, task.spUpper-task.spLower);
  438.         FreeMem(ptr, SIZE(Task));
  439.     END;
  440. END DeleteTask;
  441. PROCEDURE TermAll*;
  442.     (* called by Amiga.Close *)
  443. TYPE TermEntryPointer = POINTER TO TermEntry;
  444. VAR tl : TermEntryPointer;
  445. BEGIN
  446.     WHILE termList # 0 DO
  447.         tl := SYSTEM.VAL( TermEntryPointer, termList );
  448.         tl.proc();
  449.         termList := tl.next
  450.     END;
  451. END TermAll;
  452. PROCEDURE Register*(VAR entry : TermEntry; proc : TermProc);
  453. BEGIN
  454.     entry.proc := proc;  entry.next := termList;
  455.     termList := SYSTEM.ADR(entry);
  456. END Register;
  457. PROCEDURE Init;
  458. TYPE LibraryPtr = POINTER TO Library;
  459. VAR lib : LibraryPtr;
  460. BEGIN
  461.     SYSTEM.GET(4,execBase);
  462.     lib:=SYSTEM.VAL(LibraryPtr,execBase);
  463.     execVersion:=lib.version;
  464.     IF execVersion<37 THEN HALT(99) END
  465. END Init;
  466. PROCEDURE Term;
  467. BEGIN
  468. END Term;
  469. BEGIN
  470.     termList := null;
  471.     Init;
  472.     Register(termEntry, Term);
  473. END AmigaExec.
  474.